home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Reference / the cmsp digests ('94-'97) / csmp digest Vol 3 No 072 < prev    next >
Internet Message Format  |  1997-05-06  |  61KB

  1. From: pottier@clipper.ens.fr (Francois Pottier)
  2. Subject: csmp-digest-v3-072
  3. Date: Fri, 2 Dec 1994 16:35:30 +0100 (MET)
  4.  
  5. C.S.M.P. Digest             Fri, 02 Dec 94       Volume 3 : Issue 72
  6.  
  7. Today's Topics:
  8.  
  9.         ADSP, PPC, Apple Events ? Which to use?
  10.         ASLM, CFM, etc
  11.         Background Only Apps
  12.         Call PostEvent() from a TimeMgr task!
  13.         OSACompile and OSAExecute
  14.         PBCatSearch finder flags?
  15.         Q: SICompletionUPP
  16.  
  17.  
  18.  
  19. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  20. (pottier@clipper.ens.fr).
  21.  
  22. The digest is a collection of article threads from the internet newsgroup
  23. comp.sys.mac.programmer.  It is designed for people who read c.s.m.p. semi-
  24. regularly and want an archive of the discussions.  If you don't know what a
  25. newsgroup is, you probably don't have access to it.  Ask your systems
  26. administrator(s) for details.  If you don't have access to news, you may
  27. still be able to post messages to the group by using a mail server like
  28. anon.penet.fi (mail help@anon.penet.fi for more information).
  29.  
  30. Each issue of the digest contains one or more sets of articles (called
  31. threads), with each set corresponding to a 'discussion' of a particular
  32. subject.  The articles are not edited; all articles included in this digest
  33. are in their original posted form (as received by our news server at
  34. nef.ens.fr).  Article threads are not added to the digest until the last
  35. article added to the thread is at least two weeks old (this is to ensure that
  36. the thread is dead before adding it to the digest).  Article threads that
  37. consist of only one message are generally not included in the digest.
  38.  
  39. The digest is officially distributed by two means, by email and ftp.
  40.  
  41. If you want to receive the digest by mail, send email to listserv@ens.fr
  42. with no subject and one of the following commands as body:
  43.     help                        Sends you a summary of commands
  44.     subscribe csmp-digest Your Name    Adds you to the mailing list
  45.     signoff csmp-digest            Removes you from the list
  46. Once you have subscribed, you will automatically receive each new
  47. issue as it is created.
  48.  
  49. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  50. Questions related to the ftp site should be directed to
  51. scott.silver@dartmouth.edu. Currently no previous volumes of the CSMP
  52. digest are available there.
  53.  
  54. Also, the digests are available to WAIS users.  To search back issues
  55. with WAIS, use comp.sys.mac.programmer.src. With Mosaic, use
  56. http://www.wais.com/wais-dbs/comp.sys.mac.programmer.html.
  57.  
  58.  
  59. -------------------------------------------------------
  60.  
  61. >From gerrard@luga.latrobe.edu.au (Graeme Gerrard)
  62. Subject: ADSP, PPC, Apple Events ? Which to use?
  63. Date: Fri, 11 Nov 1994 13:51:40 GMT
  64. Organization: LaTrobe University
  65.  
  66. I need to send messages to a number
  67. of Macintoshes connected to a host over Localtalk.
  68.  
  69. The remote Macs will be running the *same program* continuously
  70. and different messages need to be sent to them.
  71. The messages are short, a couple of hundred bytes each
  72. and have to be sent every second or so.
  73. The main criteria is robustness.  The system has to run, with a minimum of
  74. maintenance, for several months.
  75.  
  76. Which is the best way to go, Apple Events, PPC toolbox, or a combination
  77. of NBP and ADSP?
  78.  
  79. Advice from anyone with experience in this kind of thing would be
  80. greatly appreciated.
  81.  
  82. -- 
  83. Graeme Gerrard                G.Gerrard@latrobe.edu.au
  84. Music Dept
  85. La Trobe University
  86.  
  87. +++++++++++++++++++++++++++
  88.  
  89. >From stevec@jolt.mpx.com.au (Stephen Coy)
  90. Date: Sun, 13 Nov 1994 00:23:28 +1100
  91. Organization: Resolve Software (WA) Pty Ltd
  92.  
  93. In article <gerrard-1211940051400001@131.172.10.162>,
  94. gerrard@luga.latrobe.edu.au (Graeme Gerrard) wrote:
  95.  
  96. > I need to send messages to a number
  97. > of Macintoshes connected to a host over Localtalk.
  98. > The remote Macs will be running the *same program* continuously
  99. > and different messages need to be sent to them.
  100. > The messages are short, a couple of hundred bytes each
  101. > and have to be sent every second or so.
  102. > The main criteria is robustness.  The system has to run, with a minimum of
  103. > maintenance, for several months.
  104. > Which is the best way to go, Apple Events, PPC toolbox, or a combination
  105. > of NBP and ADSP?
  106. > Advice from anyone with experience in this kind of thing would be
  107. > greatly appreciated.
  108.  
  109. Given the frequency of your messages, I would be inclined to build on top
  110. of the PPC toolbox. Combining this with the Threads Manager will allow
  111. your applications to function pseudo-asynchronously, independently of the
  112. Event Manager. The PPC toolbox provides functionality that you would have
  113. to build anyway if you were to build your own stuff on top of ADSP/NBP.
  114.  
  115. I suspect that the AppleEvent Manager would have trouble with the volume.
  116.  
  117. -- 
  118. Steve Coy
  119. Resolve Software (WA) Pty Ltd
  120. 4/69 Lynwood Ave
  121. Dee Why NSW 2099
  122. Australia
  123.  
  124. +++++++++++++++++++++++++++
  125.  
  126. >From h+@metrowerks.com (Jon W{tte)
  127. Date: Sun, 13 Nov 1994 11:16:47 +0100
  128. Organization: The Conspiracy
  129.  
  130. In article <gerrard-1211940051400001@131.172.10.162>,
  131. gerrard@luga.latrobe.edu.au (Graeme Gerrard) wrote:
  132.  
  133. >The main criteria is robustness.  The system has to run, with a minimum of
  134. >maintenance, for several months.
  135.  
  136. >Which is the best way to go, Apple Events, PPC toolbox, or a combination
  137. >of NBP and ADSP?
  138.  
  139. >Advice from anyone with experience in this kind of thing would be
  140. >greatly appreciated.
  141.  
  142. For the criteria mentioned, you can use any one of the methods. 
  143. NBP/ADSP is the most work, and the easiest on the network. 
  144. AppleEvents are much easier to code, but take more bandwidth. 
  145. PPC is just in the middle of them. I would use AppleEvents 
  146. because they're safe and easy to debug.
  147.  
  148. What worries me is this:
  149.  
  150. >I need to send messages to a number
  151. >of Macintoshes connected to a host over Localtalk.
  152. >The messages are short, a couple of hundred bytes each
  153. >and have to be sent every second or so.
  154.  
  155. LocalTalk has a MAXIMUM data throughput of 25 kB per second. 
  156. You have to divide by at least two, probably four, to get a 
  157. reliably sustainable data rate without too many collissions. 
  158. Two for the collission evasion on an ether media (not Ethernet, 
  159. but any CSMD media like LocalTalk), and two more for overhead 
  160. in protocols and replies. This gives you 6 kB/sec, or about 12 
  161. macs with 500 byte messages.
  162.  
  163. Max.
  164.  
  165. Cheers,
  166.  
  167.                     / h+
  168.  
  169.  
  170. --
  171.   Jon Wätte (h+@nada.kth.se), Hagagatan 1, 113 48 Stockholm, Sweden
  172.  Santa's Reindeer: Fry 1 minced onion, add 1 lb thinly sliced frozen reindeer,
  173.  fry to color, add 1/2 lb mushrooms and 1/2 lb sour cream, simmer 5 mins, add
  174.  soy to taste, salt, pepper. Serve with boiled rice and redcurrant jelly.
  175.  
  176.  
  177. +++++++++++++++++++++++++++
  178.  
  179. >From pgontier@novell.com (Pete Gontier)
  180. Date: Mon, 14 Nov 1994 20:32:55 -0800
  181. Organization: Novell, Inc., Walnut Creek/Macintosh Site
  182.  
  183. In article <gerrard-1211940051400001@131.172.10.162>,
  184. gerrard@luga.latrobe.edu.au (Graeme Gerrard) wrote:
  185.  
  186. > I need to send messages to a number
  187. > of Macintoshes connected to a host over Localtalk.
  188. > ...The main criteria is robustness....
  189. > Which is the best way to go, Apple Events, PPC toolbox, or a combination
  190. > of NBP and ADSP?
  191.  
  192. Be aware that AppleEvents are based on PPC Toolbox, and PPC Toolbox is
  193. based on ADSP. You probably already knew this, but sometimes it's useful
  194. to hear it out loud. What it means is that no matter which of the three
  195. you pick, your choice will only be as robust as ADSP, but might be less
  196. robust. This might lead you to go with ADSP, if only to reduce the number
  197. of layers involved. However, PPC Toolbox does buy you quicker comm between
  198. processes on the same Mac, and AppleEvents buy you some amount of
  199. simplification, which might end up meaning that the least tested code,
  200. yours, is more robust.
  201.  
  202. -- 
  203.  The views expressed here do not necessarily reflect those of my employer.
  204.  
  205.  "Furthermore, in my mad haste to switch CDs, I dragged the Inside Mac CD-ROM 
  206.  icon to the trash and when the Mac ejected it, the tray pushed a glass of 
  207.  grape juice off my desk and into my lap. Let that be a lesson to 
  208.  development tool vendors: all this would have been avoided with better 
  209.  documentation." -- Miguel Cruz <mnc@netcom.com>
  210.  
  211. +++++++++++++++++++++++++++
  212.  
  213. >From bdiamand@netcom.com (Ben Diamand)
  214. Date: Wed, 16 Nov 1994 03:44:59 GMT
  215. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  216.  
  217. Pete Gontier (pgontier@novell.com) wrote:
  218. : In article <gerrard-1211940051400001@131.172.10.162>,
  219. : gerrard@luga.latrobe.edu.au (Graeme Gerrard) wrote:
  220.  
  221. : > I need to send messages to a number
  222. : > of Macintoshes connected to a host over Localtalk.
  223. : > 
  224. : > ...The main criteria is robustness....
  225. : > 
  226. : > Which is the best way to go, Apple Events, PPC toolbox, or a combination
  227. : > of NBP and ADSP?
  228.  
  229. : Be aware that AppleEvents are based on PPC Toolbox, and PPC Toolbox is
  230. : based on ADSP. You probably already knew this, but sometimes it's useful
  231. : to hear it out loud. What it means is that no matter which of the three
  232. : you pick, your choice will only be as robust as ADSP, but might be less
  233. : robust. This might lead you to go with ADSP, if only to reduce the number
  234. : of layers involved. However, PPC Toolbox does buy you quicker comm between
  235. : processes on the same Mac, and AppleEvents buy you some amount of
  236. : simplification, which might end up meaning that the least tested code,
  237. : yours, is more robust.
  238.  
  239. Also be aware that ADSP in built on top of DDP.  Now I know that ddp
  240. is lower level than most want to go, BUT, if you minimum overhead and
  241. still maintain compatability, you might consider DDP as an option.  One
  242. fault of DDP is that it's connection-less, meaning packets can be lost,
  243. so if you can't afford that, ADSP is the way to go...
  244.  
  245. Ben Diamand
  246. bdiamand@netcom.com
  247.  
  248.  
  249. +++++++++++++++++++++++++++
  250.  
  251. >From Chris Russo <chris@sonicsys.com>
  252. Date: 17 Nov 1994 01:56:47 GMT
  253. Organization: Sonic Systems, Inc.
  254.  
  255. In article <gerrard-1211940051400001@131.172.10.162> Graeme Gerrard,
  256. gerrard@luga.latrobe.edu.au writes:
  257. >I need to send messages to a number
  258. >of Macintoshes connected to a host over Localtalk.
  259. >
  260. >The remote Macs will be running the *same program* continuously
  261. >and different messages need to be sent to them.
  262. >The messages are short, a couple of hundred bytes each
  263. >and have to be sent every second or so.
  264. >The main criteria is robustness.  The system has to run, with a minimum of
  265. >maintenance, for several months.
  266. >
  267. >Which is the best way to go, Apple Events, PPC toolbox, or a combination
  268. >of NBP and ADSP?
  269. >
  270. >Advice from anyone with experience in this kind of thing would be
  271. >greatly appreciated.
  272.  
  273. Go with NBP and ADSP.
  274.  
  275. Anecdote*:  My office-mate wrote Server Sentry, a remote AppleShare admin,
  276. using AppleEvents - at first.  Unfortunately, he found that AppleEvents sent
  277. to a very busy machine can die without notifying the sender of the error.  He
  278. then took a step back to rely on the PPC toolbox.  Then, you still have to
  279. mess with program linking's dialogs since the PPC toolbox doesn't allow you to
  280. authenticate a user programmatically.  He ended up having to patch
  281. GetNewDialog() to hide Program Linking's password dialog offscreen while he
  282. stuffed the user's name and password into the dialog by posting the events. 
  283. Yuck.
  284.  
  285. Stick with ADSP.  It's a little nitty grittier, but simplicity of a protocol
  286. can have a lot of advantages.  Better to spend a little extra time getting
  287. started with a project because the building blocks are smaller than to start
  288. with a higher level protocol then get stuck mid-project because the protocol
  289. lacks some functionality.  Then you have to hack the hell out of the thing. 
  290. See the previous example.
  291.  
  292. Of course, you might not want to take my word for it.  I like to use DDP
  293. whenever I can. :-)
  294.  
  295. * Don't blame me for technical inaccuracies in this anecdote.  If necessary,
  296. I'll post the source of these complaints to avoid being flamed. :-)
  297.  
  298. Thanks,
  299.  
  300. - ------------------------------------------------------------------------
  301. Chris Russo                      Macintosh Programmer
  302. Sonic Systems, Inc.              (408) 736-1900 #107
  303. chris@sonicsys.com               I'm tired of my signature.
  304.  
  305. +++++++++++++++++++++++++++
  306.  
  307. >From bdiamand@netcom.com (Ben Diamand)
  308. Date: Wed, 16 Nov 1994 03:44:59 GMT
  309. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  310.  
  311. Pete Gontier (pgontier@novell.com) wrote:
  312. : In article <gerrard-1211940051400001@131.172.10.162>,
  313. : gerrard@luga.latrobe.edu.au (Graeme Gerrard) wrote:
  314.  
  315. : > I need to send messages to a number
  316. : > of Macintoshes connected to a host over Localtalk.
  317. : > 
  318. : > ...The main criteria is robustness....
  319. : > 
  320. : > Which is the best way to go, Apple Events, PPC toolbox, or a combination
  321. : > of NBP and ADSP?
  322.  
  323. : Be aware that AppleEvents are based on PPC Toolbox, and PPC Toolbox is
  324. : based on ADSP. You probably already knew this, but sometimes it's useful
  325. : to hear it out loud. What it means is that no matter which of the three
  326. : you pick, your choice will only be as robust as ADSP, but might be less
  327. : robust. This might lead you to go with ADSP, if only to reduce the number
  328. : of layers involved. However, PPC Toolbox does buy you quicker comm between
  329. : processes on the same Mac, and AppleEvents buy you some amount of
  330. : simplification, which might end up meaning that the least tested code,
  331. : yours, is more robust.
  332.  
  333. Also be aware that ADSP in built on top of DDP.  Now I know that ddp
  334. is lower level than most want to go, BUT, if you minimum overhead and
  335. still maintain compatability, you might consider DDP as an option.  One
  336. fault of DDP is that it's connection-less, meaning packets can be lost,
  337. so if you can't afford that, ADSP is the way to go...
  338.  
  339. Ben Diamand
  340. bdiamand@netcom.com
  341.  
  342.  
  343. +++++++++++++++++++++++++++
  344.  
  345. >From bdiamand@netcom.com (Ben Diamand)
  346. Date: Wed, 16 Nov 1994 03:44:59 GMT
  347. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  348.  
  349. Pete Gontier (pgontier@novell.com) wrote:
  350. : In article <gerrard-1211940051400001@131.172.10.162>,
  351. : gerrard@luga.latrobe.edu.au (Graeme Gerrard) wrote:
  352.  
  353. : > I need to send messages to a number
  354. : > of Macintoshes connected to a host over Localtalk.
  355. : > 
  356. : > ...The main criteria is robustness....
  357. : > 
  358. : > Which is the best way to go, Apple Events, PPC toolbox, or a combination
  359. : > of NBP and ADSP?
  360.  
  361. : Be aware that AppleEvents are based on PPC Toolbox, and PPC Toolbox is
  362. : based on ADSP. You probably already knew this, but sometimes it's useful
  363. : to hear it out loud. What it means is that no matter which of the three
  364. : you pick, your choice will only be as robust as ADSP, but might be less
  365. : robust. This might lead you to go with ADSP, if only to reduce the number
  366. : of layers involved. However, PPC Toolbox does buy you quicker comm between
  367. : processes on the same Mac, and AppleEvents buy you some amount of
  368. : simplification, which might end up meaning that the least tested code,
  369. : yours, is more robust.
  370.  
  371. Also be aware that ADSP in built on top of DDP.  Now I know that ddp
  372. is lower level than most want to go, BUT, if you minimum overhead and
  373. still maintain compatability, you might consider DDP as an option.  One
  374. fault of DDP is that it's connection-less, meaning packets can be lost,
  375. so if you can't afford that, ADSP is the way to go...
  376.  
  377. Ben Diamand
  378. bdiamand@netcom.com
  379.  
  380.  
  381. +++++++++++++++++++++++++++
  382.  
  383. >From Chris Russo <chris@sonicsys.com>
  384. Date: 17 Nov 1994 01:56:47 GMT
  385. Organization: Sonic Systems, Inc.
  386.  
  387. In article <gerrard-1211940051400001@131.172.10.162> Graeme Gerrard,
  388. gerrard@luga.latrobe.edu.au writes:
  389. >I need to send messages to a number
  390. >of Macintoshes connected to a host over Localtalk.
  391. >
  392. >The remote Macs will be running the *same program* continuously
  393. >and different messages need to be sent to them.
  394. >The messages are short, a couple of hundred bytes each
  395. >and have to be sent every second or so.
  396. >The main criteria is robustness.  The system has to run, with a minimum of
  397. >maintenance, for several months.
  398. >
  399. >Which is the best way to go, Apple Events, PPC toolbox, or a combination
  400. >of NBP and ADSP?
  401. >
  402. >Advice from anyone with experience in this kind of thing would be
  403. >greatly appreciated.
  404.  
  405. Go with NBP and ADSP.
  406.  
  407. Anecdote*:  My office-mate wrote Server Sentry, a remote AppleShare admin,
  408. using AppleEvents - at first.  Unfortunately, he found that AppleEvents sent
  409. to a very busy machine can die without notifying the sender of the error.  He
  410. then took a step back to rely on the PPC toolbox.  Then, you still have to
  411. mess with program linking's dialogs since the PPC toolbox doesn't allow you to
  412. authenticate a user programmatically.  He ended up having to patch
  413. GetNewDialog() to hide Program Linking's password dialog offscreen while he
  414. stuffed the user's name and password into the dialog by posting the events. 
  415. Yuck.
  416.  
  417. Stick with ADSP.  It's a little nitty grittier, but simplicity of a protocol
  418. can have a lot of advantages.  Better to spend a little extra time getting
  419. started with a project because the building blocks are smaller than to start
  420. with a higher level protocol then get stuck mid-project because the protocol
  421. lacks some functionality.  Then you have to hack the hell out of the thing. 
  422. See the previous example.
  423.  
  424. Of course, you might not want to take my word for it.  I like to use DDP
  425. whenever I can. :-)
  426.  
  427. * Don't blame me for technical inaccuracies in this anecdote.  If necessary,
  428. I'll post the source of these complaints to avoid being flamed. :-)
  429.  
  430. Thanks,
  431.  
  432. - ------------------------------------------------------------------------
  433. Chris Russo                      Macintosh Programmer
  434. Sonic Systems, Inc.              (408) 736-1900 #107
  435. chris@sonicsys.com               I'm tired of my signature.
  436.  
  437. +++++++++++++++++++++++++++
  438.  
  439. >From pjd@triassic.midnight.com (Peter Desnoyers)
  440. Date: 18 Nov 94 15:06:14
  441. Organization: Midnight Networks Inc., Waltham MA
  442.  
  443. In article <AAEBA61F96683F2D@klkmac006.nada.kth.se> h+@metrowerks.com (Jon W{tte) writes:
  444.  >
  445.  >LocalTalk has a MAXIMUM data throughput of 25 kB per second. 
  446.  >You have to divide by at least two, probably four, to get a 
  447.  >reliably sustainable data rate without too many collissions. 
  448.  >Two for the collission evasion on an ether media (not Ethernet, 
  449.  >but any CSMD media like LocalTalk), and two more for overhead 
  450.  >in protocols and replies. This gives you 6 kB/sec, or about 12 
  451.  >macs with 500 byte messages.
  452.  
  453. You might want to go back and check your math on that one.
  454.  
  455. Localtalk is actually quite efficient - if you send max size packets
  456. on a loaded net, you will have 400us of inter-frame gap, followed by
  457. an average of 6 RTS transmissions (actually 2e) until one is ACKed
  458. successfully, at 200us each, followed by 20 ms of data. That's an
  459. efficiency of about 93%. (not counting framing and protocol overhead).
  460. Overhead goes up with smaller packets, but you could still get about
  461. 80% efficiency with 200-byte packets.
  462.  
  463. [also, the max data rate on LocalTalk is 230kb/8 = ~29kbyte/sec.]
  464.  
  465. As far as higher-layer protocol overhead goes, 2x seems like an overly
  466. high estimate, but with the right protocol I'm sure you could make it
  467. even worse than that.
  468.  
  469. ...............................................................................
  470.   Peter Desnoyers  : Midnight Networks Inc. 200 Fifth Avenue Waltham MA 02154 
  471.   pjd@midnight.com : Vox 617/890-1001 Fax -0028  The Best in Network Software
  472. --
  473.  
  474.  
  475. ...............................................................................
  476.   Peter Desnoyers  : Midnight Networks Inc. 200 Fifth Avenue Waltham MA 02154 
  477.   pjd@midnight.com : Vox 617/890-1001 Fax -0028  The Best in Network Software
  478.  
  479.  
  480. ---------------------------
  481.  
  482. >From erik@lexmark.com (Erik Ackerman)
  483. Subject: ASLM, CFM, etc
  484. Date: Wed, 16 Nov 1994 18:14:57 GMT
  485. Organization: AiC
  486.  
  487. I am working on a rewrite of an application that would greatly benefit from
  488. being "plugable".  I have been aiming for a code resource spec, but
  489. recently began to consider using ASLM or CFM (need to support 68K).  Does
  490. anyone have any recomendations as to what solution would be best?  Which
  491. will have the greatest longevity and/or support?  etc...
  492.  
  493. Thanks in advance.
  494.  
  495. Erik Ackerman
  496.  
  497. -- 
  498. erik@lexmark.com
  499.  
  500. Q: What is the difference between a duck?
  501. A: One of its legs is both the same.
  502.  
  503. +++++++++++++++++++++++++++
  504.  
  505. >From untulis@netcom.com (Jason Untulis)
  506. Date: Wed, 16 Nov 1994 20:12:22 GMT
  507. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  508.  
  509. Erik Ackerman (erik@lexmark.com) wrote:
  510. : I am working on a rewrite of an application that would greatly benefit from
  511. : being "plugable".  I have been aiming for a code resource spec, but
  512. : recently began to consider using ASLM or CFM (need to support 68K).  Does
  513. : anyone have any recomendations as to what solution would be best?  Which
  514. : will have the greatest longevity and/or support?  etc...
  515.  
  516. >From what I've read, CFM would be your best bet. ASLM is dependent on
  517. cfront C++-style name mangling, whereas CFM should work with any language.
  518. CFM alread exists on PPC, with the beta 68K CFM coming with the OpenDoc
  519. beta which is scheduled for January. I would think that CFM is the
  520. thing that will ge the most support from Apple.
  521. -- 
  522. - -----
  523. #include <std/disclaimer>           (C) 1994. All rights reserved.
  524. Jason Untulis        untulis@ (netcom.com) (tower.tandem.com)
  525.             untulis_jason@tandem.com, jason@hplcau.hpl.hp.com
  526.    "You don't want to upset the dinosaurs, do you?" -- CompuServe ad
  527.  
  528. +++++++++++++++++++++++++++
  529.  
  530. >From afcjlloyd@aol.com (AFC JLloyd)
  531. Date: 17 Nov 1994 16:20:06 -0500
  532. Organization: America Online, Inc. (1-800-827-6364)
  533.  
  534. In article <erik-161194131457@c21mac4.pfv.prtdev.lexmark.com>,
  535. erik@lexmark.com (Erik Ackerman) writes:
  536.  
  537. >I am working on a rewrite of an application that would greatly benefit
  538. from
  539. >being "plugable".  I have been aiming for a code resource spec, but
  540. >recently began to consider using ASLM or CFM (need to support 68K).  Does
  541. >anyone have any recomendations as to what solution would be best?  Which
  542. >will have the greatest longevity and/or support?  etc...
  543.  
  544. The answer probably depends upon other requirements.  Do you require C++? 
  545. Do you require the ability to develop your "plugs" with several different
  546. compilers?
  547.  
  548. If you require C++, then you should either use ASLM, which limits the
  549. compilers you can use, or you should use SOM on top of CFM.  If you don't
  550. require C++, then straight CFM is probably your best choice.  If you try
  551. to use C++ on CFM you'll probably be forced to use a single compiler, and
  552. you'll have to worry about the "fragile base class" problem.
  553.  
  554. If you use SOM, then you'll (in theory) be able to write plugs in multiple
  555. languages/compilers, and the fragile base class problem is almost
  556. completely solved.  SOM language bindings for C and C++ are available now,
  557. and other languages will probably be supported in the future.  Note that
  558. the SOM object model is very similar to Object Pascal's object model, so
  559. you give up some of the features of C++, e.g. no stack-based objects (but
  560. you can have multiple inheritance).  Also note that you can use SOM for
  561. your exported interface, but internally use all the features C++ if you so
  562. choose.
  563.  
  564. By the way, OpenDoc is being built with SOM/CFM.  One question you should
  565. answer is: can your application be built using OpenDoc?
  566.  
  567. Jim Lloyd
  568. afcjlloyd@aol.com
  569.  
  570. +++++++++++++++++++++++++++
  571.  
  572. >From mattm@apple.com (Matthew Melmon)
  573. Date: Thu, 17 Nov 1994 20:28:53 GMT
  574. Organization: Cabal Noir:  Glorious Leader
  575.  
  576. In article <untulisCzDMsn.Ir4@netcom.com>, untulis@netcom.com (Jason
  577. Untulis) wrote:
  578.  
  579. > Erik Ackerman (erik@lexmark.com) wrote:
  580. > : I am working on a rewrite of an application that would greatly benefit from
  581. > : being "plugable".  I have been aiming for a code resource spec, but
  582. > : recently began to consider using ASLM or CFM (need to support 68K).  Does
  583. > : anyone have any recomendations as to what solution would be best?  Which
  584. > : will have the greatest longevity and/or support?  etc...
  585. > From what I've read, CFM would be your best bet. ASLM is dependent on
  586. > cfront C++-style name mangling, whereas CFM should work with any language.
  587. > CFM alread exists on PPC, with the beta 68K CFM coming with the OpenDoc
  588. > beta which is scheduled for January. I would think that CFM is the
  589. > thing that will ge the most support from Apple.
  590.  
  591. A really, really, really close-to-beta (RRRCtB) of CFM-68K will be
  592. shipping on ETO 16, in a matter of weeks, now, I suppose.
  593.  
  594. -- 
  595. *X*
  596.  
  597. ---------------------------
  598.  
  599. >From ctaylor@fox.nstn.ns.ca (Christian Taylor)
  600. Subject: Background Only Apps
  601. Date: 7 Nov 1994 16:45:24 -0400
  602. Organization: Nova Scotia Technology Network
  603.  
  604. Could someone please send me some sample source code of a background only
  605. app in Pascal?  (THINK Pascal actually).  Everytime I try to make a
  606. program background only, the Mac crashes whenever I click in the
  607. Application menu!  And yes, I've read the Tech Note from ftp.apple.com on
  608. BOAs.  Thanks!
  609.  
  610. Christian
  611.  
  612. +++++++++++++++++++++++++++
  613.  
  614. >From williar2@miavx1.acs.muohio.edu (Bob Williams)
  615. Date: 7 Nov 94 19:34:03 -0500
  616. Organization: Enterprise Software
  617.  
  618. In article <ctaylor-0711941646450001@wolfville-ts-15.nstn.ca>, ctaylor@fox.nstn.ns.ca (Christian Taylor) writes:
  619. > Could someone please send me some sample source code of a background only
  620. > app in Pascal?  (THINK Pascal actually).  Everytime I try to make a
  621. > program background only, the Mac crashes whenever I click in the
  622. > Application menu!  And yes, I've read the Tech Note from ftp.apple.com on
  623. > BOAs.  Thanks!
  624. > Christian
  625.  
  626. Me too!!! I have the exact same problem. I posted here once before, but noone
  627. answered. I would greatly appreciate it. Thanks!!!
  628.  
  629. Regards,
  630. Bob
  631. -- 
  632. +------------------------------------------------------+
  633. |  Robert E. Williams, Jr.                             |
  634. |  Enterprise Software                                 |
  635. |  2006 State Route 380                                |
  636. |  Wilmington, Ohio  45177-9241                        |
  637. |  (513) 382-8232                                      |
  638. |                                                      |
  639. |  E-mail: williar2@miavx1.acs.muohio.edu              |
  640. +------------------------------------------------------+
  641. |   Those who are patient in the trivial things in     |
  642. |   life and control themselves will one day have the  |
  643. |   same mastery in great and important things.        |
  644. |      --Hapkido Master Bong Soo Han                   |
  645. +------------------------------------------------------+
  646.  
  647. +++++++++++++++++++++++++++
  648.  
  649. >From chris-b@cs.auckland.ac.nz (Chris Burns)
  650. Date: Tue, 08 Nov 1994 22:23:24 +1200
  651. Organization: AucklandUniversity:ComputerScience:HMU
  652.  
  653. In article <1994Nov7.193403.33348@miavx1>, williar2@miavx1.acs.muohio.edu
  654. (Bob Williams) wrote:
  655.  
  656. > In article <ctaylor-0711941646450001@wolfville-ts-15.nstn.ca>,
  657. ctaylor@fox.nstn.ns.ca (Christian Taylor) writes:
  658.  
  659. > > Could someone please send me some sample source code of a background only
  660. > > app in Pascal?  (THINK Pascal actually).  Everytime I try to make a
  661. > > program background only, the Mac crashes whenever I click in the
  662. > > Application menu!  And yes, I've read the Tech Note from ftp.apple.com on
  663. > > BOAs.  Thanks!
  664. > Me too!!! I have the exact same problem. I posted here once before, but noone
  665. > answered. I would greatly appreciate it. Thanks!!!
  666.  
  667. THINK Pascal automagically places standard toolbox initialization code at
  668. the beginning of your app. You need to turn this feature off for BOAs by
  669. placing a {$I-} near the top of your main program file. You also need a
  670. _MaxApplZone call (expands heap to fullest), an _InitGraf call (sets up
  671. your app A5 world) and a few _MoreMasters (to preallocate a few master
  672. pointer blocks). Your code goes after this stuff.
  673.  
  674. {-------------------------}
  675. {$I-}
  676.  
  677. program blah;
  678.  
  679. begin
  680.   MaxApplZone;
  681.   InitGraf(@thePort);
  682.  
  683.   MoreMasters;
  684.   MoreMasters;
  685.   MoreMasters;
  686.  
  687.  
  688.  
  689.  
  690.  
  691. end.
  692.  
  693. {-------------------------}
  694.  
  695. Chris B
  696. - ---------------------------------------------------------------------
  697. NewZealand:AucklandUniversity:ComputerScience:HyperMediaUnit:ChrisBurns
  698. Internet: chris-b@cs.auckland.ac.nz
  699. Phone:    +64 9 373-7599 x6194
  700. Fax:      +64 9 373-7453                         Async, therefore I am.
  701. - ---------------------------------------------------------------------
  702.  
  703. +++++++++++++++++++++++++++
  704.  
  705. >From asunta@convex.csc.FI (Miika Asunta)
  706. Date: 12 Nov 1994 17:08:43 GMT
  707. Organization: Sibelius Academy, Helsinki
  708.  
  709. In <1994Nov7.193403.33348@miavx1> williar2@miavx1.acs.muohio.edu (Bob Williams) writes:
  710.  
  711. >In article <ctaylor-0711941646450001@wolfville-ts-15.nstn.ca>, ctaylor@fox.nstn.ns.ca (Christian Taylor) writes:
  712. >> Could someone please send me some sample source code of a background only
  713. >> app in Pascal?  (THINK Pascal actually).  Everytime I try to make a
  714. >> program background only, the Mac crashes whenever I click in the
  715. >> Application menu!  And yes, I've read the Tech Note from ftp.apple.com on
  716. >> BOAs.  Thanks!
  717. >> 
  718.  
  719. I'm sorry this in in C, but I believe you can read it anyway.
  720. The projet type must be 'appe' for background application (NOT
  721. 'APPL'). In addition, set 'Only background' size option.
  722.  
  723. Since 'appe' is only background application, don't call usual
  724. toolbox-init routines. You must not use WindowManager, Menu manager
  725. etc. 
  726.  
  727. The following example misses MyQUIT() routine, an apple-event handler,
  728. that you should be able to write yourself.
  729.  
  730. That application waits quit-apple event forever, and it doesn't eat
  731. system time at all (-:
  732.  
  733. //----------------------------------------------------------
  734.  
  735. void HandleEvents(void)
  736. {
  737. WaitNextEvent(highLevelEventMask,&Event,-1L,NULL);
  738. switch(Event.what) {
  739. case kHighLevelEvent:AEProcessAppleEvent(&Event);break;
  740. }}
  741.  
  742.  
  743.  
  744. main()
  745. {
  746. MaxApplZone();
  747. MoreMasters();
  748.  
  749. AEInstallEventHandler(kCoreEventClass,kAEQuitApplication,&myQUIT,0L,0);
  750.  
  751. idletime=-1L;
  752.  
  753. do HandleEvents();
  754. while (!lopetus);
  755. }
  756.  
  757.  
  758. //------------------------------------------------------------------------
  759. --
  760. Miika Asunta
  761. asunta@convex.csc.fi            Double Bass Player
  762. tel. +358-31-255 9461            Macintosh Programmer
  763.  
  764. +++++++++++++++++++++++++++
  765.  
  766. >From chris-b@cs.auckland.ac.nz (Chris Burns)
  767. Date: Sun, 13 Nov 1994 23:07:59 +1200
  768. Organization: AucklandUniversity:ComputerScience:HMU
  769.  
  770. In article <3a2sqr$pla@pobox.csc.fi>, asunta@convex.csc.FI (Miika Asunta) wrote:
  771.  
  772. > void HandleEvents(void)
  773. > {
  774. > WaitNextEvent(highLevelEventMask,&Event,-1L,NULL);
  775. > switch(Event.what) {
  776. > case kHighLevelEvent:AEProcessAppleEvent(&Event);break;
  777. > }}
  778. > main()
  779. > {
  780. > MaxApplZone();
  781. > MoreMasters();
  782. > AEInstallEventHandler(kCoreEventClass,kAEQuitApplication,&myQUIT,0L,0);
  783. > idletime=-1L;
  784. > do HandleEvents();
  785. > while (!lopetus);
  786. > }
  787.  
  788. You really should do an:
  789.  
  790. InitGraf(&qd.thePort); // Metrowerks C/C++
  791.  
  792. or
  793.  
  794. InitGraf(&thePort); // Symantec C++
  795.  
  796. or 
  797.  
  798. InitGraf(@thePort); // THINK Pascal
  799.  
  800. after the calls to MaxApplZone() and MoreMasters(). This sets up the A5
  801. world necessary for WNE and context switching.
  802.  
  803. Chris B
  804. - ---------------------------------------------------------------------
  805. NewZealand:AucklandUniversity:ComputerScience:HyperMediaUnit:ChrisBurns
  806. Internet: chris-b@cs.auckland.ac.nz
  807. Phone:    +64 9 373-7599 x6194
  808. Fax:      +64 9 373-7453                         Async, therefore I am.
  809. - ---------------------------------------------------------------------
  810.  
  811. +++++++++++++++++++++++++++
  812.  
  813. >From jbobier@cybernetics.net (Jason Bobier)
  814. Date: Mon, 14 Nov 1994 09:12:45 -0500
  815. Organization: Prismatix Software
  816.  
  817.  
  818. Whoops... couple of problems with this...
  819.  
  820. In article <3a2sqr$pla@pobox.csc.fi>, asunta@convex.csc.FI (Miika Asunta) wrote:
  821. > I'm sorry this in in C, but I believe you can read it anyway.
  822. > The projet type must be 'appe' for background application (NOT
  823. > 'APPL'). In addition, set 'Only background' size option.
  824.  
  825. FBA's can have a type of 'APPL' and can be launched at anytime. If the
  826. type is 'appe' they will be put in the extensions folder and launched
  827. automatically at startup if dragged to the system folder.
  828.  
  829. > main()
  830. > {
  831. > MaxApplZone();
  832. > MoreMasters();
  833.  
  834. // Add the following
  835.    InitGraf(@qd.thePort);
  836.  
  837. > AEInstallEventHandler(kCoreEventClass,kAEQuitApplication,&myQUIT,0L,0);
  838. > idletime=-1L;
  839. > do HandleEvents();
  840. > while (!lopetus);
  841. > }
  842.  
  843. Jason
  844.  
  845. _____________________________________________________________________
  846. Jason A. Bobier
  847. Prismatix Software
  848.  
  849. Email: jbobier@cybernetics.net
  850.  
  851. "Living is easy with eyes closed..."  - The Beatles
  852.  
  853. +++++++++++++++++++++++++++
  854.  
  855. >From jbobier@cybernetics.net (Jason Bobier)
  856. Date: Mon, 14 Nov 1994 09:26:44 -0500
  857. Organization: Prismatix Software
  858.  
  859. In article <jbobier-1411940912450001@bobier.cybernetics.net>,
  860. jbobier@cybernetics.net (Jason Bobier) wrote:
  861.  
  862. > Whoops... couple of problems with this...
  863. Whoops... Late night with Macsbug...
  864.  
  865. > > main()
  866. > > {
  867. > > MaxApplZone();
  868. > > MoreMasters();
  869.  
  870. // What I said
  871. > // Add the following
  872. >    InitGraf(@qd.thePort);
  873.  
  874. // What I meant
  875.    InitGraf(&qd.thePort);
  876. > > 
  877. > > AEInstallEventHandler(kCoreEventClass,kAEQuitApplication,&myQUIT,0L,0);
  878. > > 
  879. > > idletime=-1L;
  880. > > 
  881. > > do HandleEvents();
  882. > > while (!lopetus);
  883. > > }
  884.  
  885. Sorry,
  886.  
  887. Jason
  888.  
  889. _____________________________________________________________________
  890. Jason A. Bobier
  891. Prismatix Software
  892.  
  893. Email: jbobier@cybernetics.net
  894.  
  895. "Living is easy with eyes closed..."  - The Beatles
  896.  
  897. +++++++++++++++++++++++++++
  898.  
  899. >From here@there (Somone)
  900. Date: 17 Nov 1994 01:10:52 GMT
  901. Organization: Large Fuzzy Room
  902.  
  903. Here.  The Rez code and the C code to make the simplest possbile FBA.
  904. I took all the comments out so it wouldn't take much space in a posting, if
  905. you need parts of this explained *please* do your research and pull an FBA
  906. sample off summex or somewhere.
  907.  
  908. /* rez data */
  909. resource 'SIZE' (-1) {
  910.     reserved,
  911.     acceptSuspendResumeEvents,
  912.     reserved,
  913.     canBackground,
  914.     notMultiFinderAware,
  915.     onlyBackground,
  916.     dontGetFrontClicks,
  917.     ignoreChildDiedEvents,
  918.     not32BitCompatible,
  919.     isHighLevelEventAware,
  920.     localAndRemoteHLEvents,
  921.     notStationeryAware,
  922.     dontUseTextEditServices,
  923.     reserved,
  924.     reserved,
  925.     reserved,
  926.     50000,
  927.     50000
  928. };
  929.  
  930. /* C code */
  931. #include <Events.h>
  932. #include <AppleEvents.h>
  933. #include <QuickDraw.h>
  934. #include <GestaltEqu.h>
  935. #include <SegLoad.h>
  936. struct AEinstalls {
  937.     AEEventClass theClass;
  938.     AEEventID theEvent;
  939.     EventHandlerProcPtr theProc;
  940. };
  941. typedef struct AEinstalls AEinstalls;
  942.  
  943. Boolean gQuit = false;
  944. EventRecord ERecord;
  945. Boolean gHasAppleEvents;
  946.  
  947. main()
  948. {
  949.     InitGraf((Ptr)&qd.thePort);   
  950.      InitAEStuff();
  951.     while (gQuit == false) {
  952.         WaitNextEvent(highLevelEventMask, &ERecord, 30, 0);
  953.         if (ERecord.what == kHighLevelEvent)
  954.             DoHighLevel(&ERecord);
  955.     }
  956. }
  957.  
  958. void InitAEStuff(void)
  959. {
  960.     AEinstalls HandlersToInstall[] =  {
  961.          {
  962.             kCoreEventClass, kAEOpenApplication, AEOpenHandler
  963.         },  {
  964.             kCoreEventClass, kAEOpenDocuments, AEOpenDocHandler
  965.         },  {
  966.             kCoreEventClass, kAEQuitApplication, AEQuitHandler
  967.         },  {
  968.             kCoreEventClass, kAEPrintDocuments, AEPrintHandler
  969.         }, 
  970.     
  971.         
  972.     };
  973.     
  974.     OSErr aevtErr = noErr;
  975.     long aLong = 0;
  976.     Boolean gHasAppleEvents = false;
  977.     gHasAppleEvents = (Gestalt(gestaltAppleEventsAttr, &aLong) == noErr);
  978.     if (gHasAppleEvents) {
  979.         register qq;
  980.         for (qq = 0; qq < ((sizeof(HandlersToInstall) /
  981. sizeof(AEinstalls))); qq++) {
  982.             aevtErr = AEInstallEventHandler(HandlersToInstall[qq].theClass,
  983. HandlersToInstall[qq].theEvent,
  984.                                             HandlersToInstall[qq].theProc,
  985. 0, false);
  986.             if (aevtErr) {
  987.                 ExitToShell();                              /* just fail,
  988. baby */
  989.             }
  990.         }
  991.     } else {
  992.         ExitToShell();
  993.     }
  994. }
  995.  
  996. void DoHighLevel(EventRecord *AERecord)
  997. {
  998.     AEProcessAppleEvent(AERecord);
  999.     
  1000. }
  1001.  
  1002. pascal OSErr AEOpenHandler(AppleEvent *messagein, AppleEvent *reply, long
  1003. refIn)
  1004. {
  1005. #pragma unused (messagein,reply,refIn)
  1006.     return(noErr);
  1007. }
  1008. pascal OSErr AEOpenDocHandler(AppleEvent *messagein, AppleEvent *reply,
  1009. long refIn)
  1010. {
  1011. #pragma unused (reply, refIn,messagein)
  1012.     return(errAEEventNotHandled);
  1013. }
  1014.  
  1015. pascal OSErr AEPrintHandler(AppleEvent *messagein, AppleEvent *reply, long
  1016. refIn)
  1017. {
  1018. #pragma unused (reply,refIn,messagein)
  1019.     return(errAEEventNotHandled);
  1020. }
  1021.  
  1022. pascal OSErr AEQuitHandler(AppleEvent *messagein, AppleEvent *reply, long
  1023. refIn)
  1024. {
  1025. #pragma unused (messagein,refIn,reply)
  1026.     gQuit = true;
  1027.     return(noErr);
  1028.  
  1029. ---------------------------
  1030.  
  1031. >From euajgo@eua.ericsson.se (Joakim Grebeno)
  1032. Subject: Call PostEvent() from a TimeMgr task!
  1033. Date: 9 Nov 1994 15:38:47 GMT
  1034. Organization: Ellemtel Telecom Systems Labs, Stockholm, Sweden
  1035.  
  1036. Hi!
  1037. Would it actually be possible to do a PostEvent() from a task
  1038. (interrupt) triggered by the TimeManager, or is it forbidden?
  1039.  
  1040. I would like to:
  1041.  
  1042. 1. Setup an action to be executed at a later stage i.e. using
  1043.    InsTime() passing it a pointer to a function called A.
  1044.  
  1045. 2. When the timed action is due to be executed it passes the
  1046.    pointer to A to the main event loop using PostEvent() ['app1Evt'].
  1047.  
  1048. 3. The main event loop receives the event 'app1Evt' and calls
  1049.    function A contained in the event.
  1050.  
  1051. Would this actually be possible?
  1052.  
  1053. Thanks Joakim
  1054. -- 
  1055. A: Look! It's a blast-furnace!
  1056. B: It's a tree branch!
  1057. A: OK! I can see that now!
  1058.  
  1059. +++++++++++++++++++++++++++
  1060.  
  1061. >From Glenn L. Austin <glenn_a@efn.org>
  1062. Date: Thu, 10 Nov 1994 17:25:00 GMT
  1063. Organization: Eugene FreeNet
  1064.  
  1065. In article <39qqe7$mbp@euas20.eua.ericsson.se> Joakim Grebeno,
  1066. euajgo@eua.ericsson.se writes:
  1067. >Would it actually be possible to do a PostEvent() from a task
  1068. >(interrupt) triggered by the TimeManager, or is it forbidden?
  1069.  
  1070. PostEvent doesn't move memory, so as long as your time manager routine
  1071. doesn't move memory (a big no-no), yes, you could post an event.
  1072. //
  1073. // Glenn L. Austin
  1074. // Computer Wizard and Racing Car Driver
  1075. // Internet:  glenn_a@efn.org
  1076. //
  1077.  
  1078. +++++++++++++++++++++++++++
  1079.  
  1080. >From euajgo@eua.ericsson.se (Joakim Grebeno)
  1081. Date: 11 Nov 1994 08:14:04 GMT
  1082. Organization: Ellemtel Telecom Systems Labs, Stockholm, Sweden
  1083.  
  1084. Glenn L. Austin <glenn_a@efn.org> writes:
  1085.  
  1086. >In article <39qqe7$mbp@euas20.eua.ericsson.se> Joakim Grebeno,
  1087. >euajgo@eua.ericsson.se writes:
  1088. >>Would it actually be possible to do a PostEvent() from a task
  1089. >>(interrupt) triggered by the TimeManager, or is it forbidden?
  1090.  
  1091. >PostEvent doesn't move memory, so as long as your time manager routine
  1092. >doesn't move memory (a big no-no), yes, you could post an event.
  1093.  
  1094. Thanks! That's one problem out of the way! Furthermore I suppose that I
  1095. have to setup the my applications A5 world in the task before doing a
  1096. PostEvent()?
  1097. If this is the case I'm forced to pass two parameters to the TimeManager
  1098. task i.e the current A5 *and* the pointer to the function I want to post to
  1099. the main event loop. Could this really be done?
  1100.  
  1101. Thanks
  1102. Joakim
  1103.  
  1104. -- 
  1105. A: Look! It's a blast-furnace!
  1106. B: It's a tree branch!
  1107. A: OK! I can see that now!
  1108.  
  1109. +++++++++++++++++++++++++++
  1110.  
  1111. >From scouten@uiuc.edu (Eric Scouten)
  1112. Date: Fri, 11 Nov 1994 10:01:38 -0600
  1113. Organization: University of Illinois
  1114.  
  1115. [follow-ups redirected to comp.sys.mac.programmer.help]
  1116.  
  1117. In article <39v94c$s7h@euas20.eua.ericsson.se>, euajgo@eua.ericsson.se
  1118. (Joakim Grebeno) wrote:
  1119.  
  1120. > Thanks! That's one problem out of the way! Furthermore I suppose that I
  1121. > have to setup the my applications A5 world in the task before doing a
  1122. > PostEvent()?
  1123. > If this is the case I'm forced to pass two parameters to the TimeManager
  1124. > task i.e the current A5 *and* the pointer to the function I want to post to
  1125. > the main event loop. Could this really be done?
  1126.  
  1127. Yes, this is very easy to do. Just extend the TMTask record. You can do
  1128. something like this:
  1129.  
  1130. struct MyTMTask {
  1131.    TMTask       tm;
  1132.    long         itsA5;
  1133.    long         refCon;      // whatever your other parameter was
  1134. };
  1135.  
  1136.  
  1137. -es
  1138.  
  1139. __________________________________________________________________________
  1140. Eric Scouten <scouten@uiuc.edu> * MS Comp Sci '96, Univ of Illinois
  1141.  
  1142. IMPORTANT NOTICE TO READERS: The entire physical universe, including this
  1143. message, may one day collapse back into an infinitesimally small space.
  1144. Should another universe subsequently re-emerge, the existence of this message
  1145. cannot be guaranteed.
  1146.    -with apologies to Devine & Cohen (Absolute Zero Gravity)
  1147.  
  1148. +++++++++++++++++++++++++++
  1149.  
  1150. >From reed@medicine.wustl.edu (Thomas Reed)
  1151. Date: Thu, 10 Nov 1994 10:25:25 -0600
  1152. Organization: Washington University
  1153.  
  1154. I dunno if calling PostEvent is legal or not in that case.  However, it
  1155. sounds like for what you need, a safer method might be to have your TM
  1156. task set a certain global flag, which your main event loop constantly
  1157. checks for.  When you see the flag set, you call the function.  I use just
  1158. this method to draw a picture to the screen every 5 seconds in one of my
  1159. programs, and it works quite nicely.
  1160.  
  1161. -Thomas
  1162.  
  1163. =====================================================
  1164. Thomas Reed                     Washington University
  1165. reed@telesphere.wustl.edu           Medical School
  1166. reed@medicine.wustl.edu            Saint Louis, MO
  1167. - ---------------------------------------------------
  1168. Clothes make the man.  Naked people have little or no
  1169. influence on society.  -- Mark Twain
  1170. =====================================================
  1171.  
  1172. Opinions posted are not the opinions of Wash. U.
  1173.  
  1174. +++++++++++++++++++++++++++
  1175.  
  1176. >From bdiamand@netcom.com (Ben Diamand)
  1177. Date: Wed, 16 Nov 1994 04:04:16 GMT
  1178. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1179.  
  1180. Joakim Grebeno (euajgo@eua.ericsson.se) wrote:
  1181. : Hi!
  1182. : Would it actually be possible to do a PostEvent() from a task
  1183. : (interrupt) triggered by the TimeManager, or is it forbidden?
  1184.  
  1185. : I would like to:
  1186.  
  1187. : 1. Setup an action to be executed at a later stage i.e. using
  1188. :    InsTime() passing it a pointer to a function called A.
  1189.  
  1190. : 2. When the timed action is due to be executed it passes the
  1191. :    pointer to A to the main event loop using PostEvent() ['app1Evt'].
  1192.  
  1193. : 3. The main event loop receives the event 'app1Evt' and calls
  1194. :    function A contained in the event.
  1195.  
  1196. : Would this actually be possible?
  1197.  
  1198. While PostEvent doesn't move/purge memory, the MacOS is not necessarily
  1199. re-entrant in this area(or almost any area)...In other words, for all
  1200. you know, someone else was calling PostEvent whem the timer went off
  1201. and was right in the middle of posting an event when you call PostEvent!
  1202.  
  1203. This _could_ be really bad...I'd go for the flag/post scheme, where you
  1204. flag a variable and then call PostEvent from within your main event loop...
  1205.  
  1206. Ben Diamand
  1207. bdiamand@netcom.com
  1208.  
  1209.  
  1210. +++++++++++++++++++++++++++
  1211.  
  1212. >From greg@cosc.canterbury.ac.nz (Greg Ewing)
  1213. Date: 17 Nov 1994 01:13:51 GMT
  1214. Organization: University of Canterbury, Christchurch, New Zealand
  1215.  
  1216.  
  1217. In article <bdiamandCzCDz5.4HB@netcom.com>, bdiamand@netcom.com (Ben Diamand) writes:
  1218. |> for all
  1219. |> you know, someone else was calling PostEvent whem the timer went off
  1220. |> and was right in the middle of posting an event when you call PostEvent!
  1221.  
  1222. It must surely be possible to post events at interrupt
  1223. time - else what do the mouse and keyboard interrupt
  1224. handlers do?
  1225.  
  1226. I suspect that PostEvent disables interrupts while it is
  1227. manipulating the event queue, in which case it would be
  1228. safe to call it at interrupt time.
  1229.  
  1230. But this is only a *guess* - attempt it at your own
  1231. risk!
  1232.  
  1233. |> Ben Diamand
  1234. |> bdiamand@netcom.com
  1235.  
  1236. Greg Ewing, Computer Science Dept, +--------------------------------------+
  1237. University of Canterbury,       | A citizen of NewZealandCorp, a      |
  1238. Christchurch, New Zealand       | wholly-owned subsidiary of Japan Inc.|
  1239. greg@cosc.canterbury.ac.nz       +--------------------------------------+
  1240.  
  1241. +++++++++++++++++++++++++++
  1242.  
  1243. >From pchang@Xenon.Stanford.EDU (The Weasel)
  1244. Date: 17 Nov 1994 19:46:35 GMT
  1245. Organization: Computer Science Department, Stanford University.
  1246.  
  1247. In article <3aeaof$brg@cantua.canterbury.ac.nz>,
  1248. Greg Ewing <greg@cosc.canterbury.ac.nz> wrote:
  1249. >In article <bdiamandCzCDz5.4HB@netcom.com>, bdiamand@netcom.com (Ben Diamand) writes:
  1250. >|> for all
  1251. >|> you know, someone else was calling PostEvent whem the timer went off
  1252. >|> and was right in the middle of posting an event when you call PostEvent!
  1253. >
  1254. >It must surely be possible to post events at interrupt
  1255. >time - else what do the mouse and keyboard interrupt
  1256. >handlers do?
  1257.  
  1258. It is possible to do. Check out PPostEvent. What you get back is the
  1259. eventqueue element, dequeue and enqueue turn off interrupts when
  1260. playing with the queues. I'm pretty sure that PostEvent is just doing
  1261. the same thing.
  1262.  
  1263. However, consider what event queue you are going to be slamming this
  1264. event into. I sort of missed the start of this discussion so I'm not
  1265. sure why you are putting the events in the queue, but you really need
  1266. to check to make sure which app is frontmost at the time as it is that
  1267. apps eventqueue that is going to be mucked with.
  1268.  
  1269. Peter
  1270.  
  1271.  
  1272.  
  1273.  
  1274. +++++++++++++++++++++++++++
  1275.  
  1276. >From bdiamand@netcom.com (Ben Diamand)
  1277. Date: Wed, 16 Nov 1994 04:04:16 GMT
  1278. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1279.  
  1280. Joakim Grebeno (euajgo@eua.ericsson.se) wrote:
  1281. : Hi!
  1282. : Would it actually be possible to do a PostEvent() from a task
  1283. : (interrupt) triggered by the TimeManager, or is it forbidden?
  1284.  
  1285. : I would like to:
  1286.  
  1287. : 1. Setup an action to be executed at a later stage i.e. using
  1288. :    InsTime() passing it a pointer to a function called A.
  1289.  
  1290. : 2. When the timed action is due to be executed it passes the
  1291. :    pointer to A to the main event loop using PostEvent() ['app1Evt'].
  1292.  
  1293. : 3. The main event loop receives the event 'app1Evt' and calls
  1294. :    function A contained in the event.
  1295.  
  1296. : Would this actually be possible?
  1297.  
  1298. While PostEvent doesn't move/purge memory, the MacOS is not necessarily
  1299. re-entrant in this area(or almost any area)...In other words, for all
  1300. you know, someone else was calling PostEvent whem the timer went off
  1301. and was right in the middle of posting an event when you call PostEvent!
  1302.  
  1303. This _could_ be really bad...I'd go for the flag/post scheme, where you
  1304. flag a variable and then call PostEvent from within your main event loop...
  1305.  
  1306. Ben Diamand
  1307. bdiamand@netcom.com
  1308.  
  1309.  
  1310. +++++++++++++++++++++++++++
  1311.  
  1312. >From bdiamand@netcom.com (Ben Diamand)
  1313. Date: Wed, 16 Nov 1994 04:04:16 GMT
  1314. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1315.  
  1316. Joakim Grebeno (euajgo@eua.ericsson.se) wrote:
  1317. : Hi!
  1318. : Would it actually be possible to do a PostEvent() from a task
  1319. : (interrupt) triggered by the TimeManager, or is it forbidden?
  1320.  
  1321. : I would like to:
  1322.  
  1323. : 1. Setup an action to be executed at a later stage i.e. using
  1324. :    InsTime() passing it a pointer to a function called A.
  1325.  
  1326. : 2. When the timed action is due to be executed it passes the
  1327. :    pointer to A to the main event loop using PostEvent() ['app1Evt'].
  1328.  
  1329. : 3. The main event loop receives the event 'app1Evt' and calls
  1330. :    function A contained in the event.
  1331.  
  1332. : Would this actually be possible?
  1333.  
  1334. While PostEvent doesn't move/purge memory, the MacOS is not necessarily
  1335. re-entrant in this area(or almost any area)...In other words, for all
  1336. you know, someone else was calling PostEvent whem the timer went off
  1337. and was right in the middle of posting an event when you call PostEvent!
  1338.  
  1339. This _could_ be really bad...I'd go for the flag/post scheme, where you
  1340. flag a variable and then call PostEvent from within your main event loop...
  1341.  
  1342. Ben Diamand
  1343. bdiamand@netcom.com
  1344.  
  1345.  
  1346. +++++++++++++++++++++++++++
  1347.  
  1348. >From greg@cosc.canterbury.ac.nz (Greg Ewing)
  1349. Date: 17 Nov 1994 01:13:51 GMT
  1350. Organization: University of Canterbury, Christchurch, New Zealand
  1351.  
  1352.  
  1353. In article <bdiamandCzCDz5.4HB@netcom.com>, bdiamand@netcom.com (Ben Diamand) writes:
  1354. |> for all
  1355. |> you know, someone else was calling PostEvent whem the timer went off
  1356. |> and was right in the middle of posting an event when you call PostEvent!
  1357.  
  1358. It must surely be possible to post events at interrupt
  1359. time - else what do the mouse and keyboard interrupt
  1360. handlers do?
  1361.  
  1362. I suspect that PostEvent disables interrupts while it is
  1363. manipulating the event queue, in which case it would be
  1364. safe to call it at interrupt time.
  1365.  
  1366. But this is only a *guess* - attempt it at your own
  1367. risk!
  1368.  
  1369. |> Ben Diamand
  1370. |> bdiamand@netcom.com
  1371.  
  1372. Greg Ewing, Computer Science Dept, +--------------------------------------+
  1373. University of Canterbury,       | A citizen of NewZealandCorp, a      |
  1374. Christchurch, New Zealand       | wholly-owned subsidiary of Japan Inc.|
  1375. greg@cosc.canterbury.ac.nz       +--------------------------------------+
  1376.  
  1377. +++++++++++++++++++++++++++
  1378.  
  1379. >From pchang@Xenon.Stanford.EDU (The Weasel)
  1380. Date: 17 Nov 1994 19:46:35 GMT
  1381. Organization: Computer Science Department, Stanford University.
  1382.  
  1383. In article <3aeaof$brg@cantua.canterbury.ac.nz>,
  1384. Greg Ewing <greg@cosc.canterbury.ac.nz> wrote:
  1385. >In article <bdiamandCzCDz5.4HB@netcom.com>, bdiamand@netcom.com (Ben Diamand) writes:
  1386. >|> for all
  1387. >|> you know, someone else was calling PostEvent whem the timer went off
  1388. >|> and was right in the middle of posting an event when you call PostEvent!
  1389. >
  1390. >It must surely be possible to post events at interrupt
  1391. >time - else what do the mouse and keyboard interrupt
  1392. >handlers do?
  1393.  
  1394. It is possible to do. Check out PPostEvent. What you get back is the
  1395. eventqueue element, dequeue and enqueue turn off interrupts when
  1396. playing with the queues. I'm pretty sure that PostEvent is just doing
  1397. the same thing.
  1398.  
  1399. However, consider what event queue you are going to be slamming this
  1400. event into. I sort of missed the start of this discussion so I'm not
  1401. sure why you are putting the events in the queue, but you really need
  1402. to check to make sure which app is frontmost at the time as it is that
  1403. apps eventqueue that is going to be mucked with.
  1404.  
  1405. Peter
  1406.  
  1407.  
  1408.  
  1409.  
  1410. +++++++++++++++++++++++++++
  1411.  
  1412. >From gspnx@di.unito.it (Fabrizio Oddone)
  1413. Date: Thu, 17 Nov 1994 15:42:41 +0100
  1414. Organization: Politecnico di Torino - Italy
  1415.  
  1416. In article <bdiamandCzCDz5.4HB@netcom.com>, bdiamand@netcom.com (Ben
  1417. Diamand) wrote:
  1418.  
  1419. > Joakim Grebeno (euajgo@eua.ericsson.se) wrote:
  1420. > : I would like to:
  1421. > : 1. Setup an action to be executed at a later stage i.e. using
  1422. > :    InsTime() passing it a pointer to a function called A.
  1423. > : 2. When the timed action is due to be executed it passes the
  1424. > :    pointer to A to the main event loop using PostEvent() ['app1Evt'].
  1425. > : 3. The main event loop receives the event 'app1Evt' and calls
  1426. > :    function A contained in the event.
  1427.  
  1428. Also, PostEvent() posts the event to the frontmost application, not
  1429. necessarily to your app, because there is a single event queue for all the
  1430. running apps.
  1431.  
  1432. So forget the appXEvt stuff and take a look at the Notification Manager...
  1433.  
  1434. -- 
  1435. Fabrizio Oddone
  1436. gspnx@di.unito.it
  1437.  
  1438. ---------------------------
  1439.  
  1440. >From Travis Peckham <travis@mirna.together.uvm.edu>
  1441. Subject: OSACompile and OSAExecute
  1442. Date: Thu, 17 Nov 1994 17:01:45 GMT
  1443. Organization: EMBA Computer Facility, University of Vermont
  1444.  
  1445. Hi All,
  1446.  
  1447. I was reading the comp.sys.mac.programmer FAQ (trying to get up to
  1448. speed on AppleEvents and AppleScript) 
  1449.  
  1450. I found this:
  1451.  
  1452. >5.2) Q:Can I compile and run scripts from my application?
  1453.  
  1454. >A: Yes, this is very simple. There are toolbox calls for reading
  1455. >scripts, compiling scripts and executing scripts. (OSACompile,
  1456. >OSAExecute)...
  1457.  
  1458. Does anyone know of some example source code which uses these calls 
  1459. to compile and execute an AppleScript? I'd be greatful.
  1460.  
  1461. Thanks!
  1462.  
  1463. Travis
  1464.  
  1465. +++++++++++++++++++++++++++
  1466.  
  1467. >From jeremy@dewey.soe.berkeley.edu (Jeremy Roschelle)
  1468. Date: Fri, 18 Nov 1994 09:42:05 -0800
  1469. Organization: SimCalc Project
  1470.  
  1471. In article <1994Nov17.170145.5835@emba.uvm.edu>, Travis Peckham
  1472. <travis@mirna.together.uvm.edu> wrote:
  1473.  
  1474. > Does anyone know of some example source code which uses these calls 
  1475. > to compile and execute an AppleScript? I'd be greatful.
  1476.  
  1477. here are two snippets (CodeWarrior C++) that should get you started:
  1478.  
  1479. OSErr 
  1480. SCScriptEditor::CompileScript()
  1481. {
  1482.    OSErr err;
  1483.    AEDesc   scriptText = {typeChar,nil};
  1484.    
  1485.    // get the text we want to compile
  1486.    scriptText.dataHandle = mTextEdit->GetTextHandle();
  1487.    err = ::OSACompile(GetScriptingComponent(),
  1488.                   &scriptText,
  1489.                   kOSAModeNull,
  1490.                   &mScriptID);
  1491.    mCompiledOK = (err == noErr);
  1492.    return err;
  1493. }
  1494.  
  1495. // this executes a script that was previously loaded (with the resulting ID)
  1496. void
  1497. ExecuteScript(ComponentInstance inScriptingComponent, OSAID inScriptID)
  1498. {
  1499.    OSAID       resultID;
  1500.    
  1501.   
  1502. OSAExecute(inScriptingComponent,inScriptID,kOSANullScript,kOSAModeNull,&resultID);
  1503.    OSADispose(inScriptingComponent,resultID);
  1504. }
  1505.  
  1506. The first snippet stores the script ID in the member variable mScriptID.
  1507. You would pass this ID to the Execute function.
  1508.  
  1509. // this will get you a scripting component:
  1510.  
  1511.    scriptingComponent = OpenDefaultComponent(kOSAComponentType,'scpt');
  1512.  
  1513. good luck,
  1514.  
  1515.  Jeremy Roschelle
  1516. [-------*--------] SimCalc Project
  1517. [------*-*-------] 4104 24th Street #344
  1518. [-------*--------] San Francisco CA 94114
  1519.  
  1520. +++++++++++++++++++++++++++
  1521.  
  1522. >From Jens Alfke <jens_alfke@powertalk.apple.com>
  1523. Date: Fri, 18 Nov 1994 22:02:16 GMT
  1524. Organization: Apple Computer
  1525.  
  1526. Travis Peckham, travis@mirna.together.uvm.edu writes:
  1527. > Does anyone know of some example source code which uses these calls 
  1528. > to compile and execute an AppleScript? I'd be greatful.
  1529.  
  1530. There's a good article by Paul Smith in a recent issue of 'develop' (17?)
  1531. that illustrates this and much more. I don't know the exact issue number
  1532. offhand, but each one includes all the back issues on CD-ROM so you can find
  1533. it if you get the latest issue.
  1534.  
  1535. --Jens Alfke                           jens_alfke@powertalk.apple.com
  1536.                    "A man, a plan, a yam, a can of Spam ... Bananama!"
  1537.  
  1538. ---------------------------
  1539.  
  1540. >From ttyab@vaal.cpr.upenn.edu ()
  1541. Subject: PBCatSearch finder flags?
  1542. Date: 8 Nov 1994 21:12:16 GMT
  1543. Organization: University of Pennsylvania
  1544.  
  1545. Hi,
  1546.     I am trying to use PBCatSearch to search for files
  1547. and EXCLUDE alias files.  The search is already working with
  1548. the ioNamePtr and ioFlAttrib flags and I would like to add
  1549. whatever it takes to make the search exclude aliases.
  1550.  
  1551.     If a file is an alias, then ioFlFndrInfo.fdFlags will
  1552. have bit 15 set (0x8000).  Ok, well, in the CInfoPBRec search1
  1553. do I set ioFlFndrInfo.fdFlags = 0x0FFF??? (I don't care what the
  1554. other 14 bits are) and then set search2 to 0xF000?
  1555.  
  1556.     (Search2 is "the mask").  Basically I don't know how
  1557. to set the target and mask to include files with bit 15 == 0.
  1558. Can some kind soul offer a solution?  
  1559.  
  1560. THanks!
  1561. .
  1562.  
  1563.  
  1564. +++++++++++++++++++++++++++
  1565.  
  1566. >From jumplong@aol.com (Jump Long)
  1567. Date: 17 Nov 1994 03:10:07 -0500
  1568. Organization: America Online, Inc. (1-800-827-6364)
  1569.  
  1570. In article <39opjg$bfm@netnews.upenn.edu>, ttyab@vaal.cpr.upenn.edu ()
  1571. writes:
  1572.  
  1573. >Basically I don't know how to set the target and mask to include files
  1574. >with bit 15 == 0. Can some kind soul offer a solution?
  1575.  
  1576. This will do it for you.
  1577.  
  1578. /* find files with alias bit clear */
  1579. searchInfo1.hFileInfo.ioFlFndrInfo.fdFlags = 0x0000; /* match when alias
  1580. bit is clear */
  1581. searchInfo2.hFileInfo.ioFlFndrInfo.fdFlags = 0x8000; /* we're interested
  1582. only in the alias bit */
  1583.  
  1584. Make sure you clear out the rest of the finder info record in both
  1585. searchInfo1 and searchInfo2, and set the fsSBFlFndrInfo search bit.
  1586.  
  1587. - Jim Luther
  1588.  
  1589.  
  1590. ---------------------------
  1591.  
  1592. >From gg110@cus.cam.ac.uk (G. Gavazzi)
  1593. Subject: Q: SICompletionUPP
  1594. Date: 16 Nov 1994 01:30:09 GMT
  1595. Organization: University of Cambridge, England
  1596.  
  1597. hi,
  1598. I am trying to make an asynchronous sound recording (to memory)
  1599. and I cannot figure out how to pass the address of my completionRoutine
  1600. (and interruptRoutine as well). My program keeps on crashing when
  1601. it calls SPBRecord(myinParamPtr,TRUE) since I put in myinParamPtr
  1602. the routines addresses.
  1603. I use:
  1604. SICompletionUPP                mycompletionRoutine(SPBPtr);
  1605. SIInterruptUPP                myinterruptRoutine(void);    
  1606. main(){
  1607. SICompletionUPP                mycompletionRoutine(SPBPtr);
  1608. SIInterruptUPP                myinterruptRoutine(void);       
  1609. ...
  1610. myinParam.completionRoutine = (SICompletionUPP)mycompletionRoutine;
  1611. myinParam.interruptRoutine = (SIInterruptUPP)myinterruptRoutine;
  1612.  
  1613. }
  1614. SICompletionUPP    mycompletionRoutine(SPBPtr inParamPtr)
  1615. {
  1616. operations on a buffer whose pointer is passed in myinParamPtr->userLong
  1617. no return value
  1618. }
  1619. SIInterruptUPP                myinterruptRoutine(void){}
  1620. I don't need to do anything when the input device is full, I could indeed
  1621. put myinParam.interruptRoutine = 0; above.
  1622.  
  1623. If I put both routines fields in myinParam = 0 my program does not
  1624. crash, it simply does not know when it's buffer is full of data.
  1625. Can anybody point me to the (C please) solution? (yes, I am going
  1626. to buy NIM on CD if it is affordable).
  1627. Thank you,
  1628. Giuliano Gavazzi
  1629.  
  1630. +++++++++++++++++++++++++++
  1631.  
  1632. >From chris-b@cs.auckland.ac.nz (Chris Burns)
  1633. Date: Thu, 17 Nov 1994 00:40:45 +1200
  1634. Organization: AucklandUniversity:ComputerScience:HMU
  1635.  
  1636. In article <3abnb1$83j@lyra.csx.cam.ac.uk>, gg110@cus.cam.ac.uk (G.
  1637. Gavazzi) wrote:
  1638.  
  1639. > I am trying to make an asynchronous sound recording (to memory)
  1640. > and I cannot figure out how to pass the address of my completionRoutine
  1641. > (and interruptRoutine as well). My program keeps on crashing when
  1642. > it calls SPBRecord(myinParamPtr,TRUE) since I put in myinParamPtr
  1643. > the routines addresses.
  1644. > I use:
  1645. > SICompletionUPP                         mycompletionRoutine(SPBPtr);
  1646. > SIInterruptUPP                          myinterruptRoutine(void);       
  1647. > main(){
  1648. > SICompletionUPP                         mycompletionRoutine(SPBPtr);
  1649. > SIInterruptUPP                          myinterruptRoutine(void);       
  1650. > ...
  1651. > myinParam.completionRoutine = (SICompletionUPP)mycompletionRoutine;
  1652. > myinParam.interruptRoutine = (SIInterruptUPP)myinterruptRoutine;
  1653. > }
  1654. > SICompletionUPP mycompletionRoutine(SPBPtr inParamPtr)
  1655. > {
  1656. > operations on a buffer whose pointer is passed in myinParamPtr->userLong
  1657. > no return value
  1658. > }
  1659. > SIInterruptUPP                          myinterruptRoutine(void){}
  1660. > I don't need to do anything when the input device is full, I could indeed
  1661. > put myinParam.interruptRoutine = 0; above.
  1662. > If I put both routines fields in myinParam = 0 my program does not
  1663. > crash, it simply does not know when it's buffer is full of data.
  1664.  
  1665.  
  1666.  
  1667.  
  1668. Here's some code I whipped up the other day to do almost exactly this:
  1669. The    #pragma parameter    bit was necessary to tell the 68K compiler
  1670. where the parameters are stashed on entry in 68K mode.
  1671.  
  1672. ///////////////////////////////////////////////////////////////////////////////
  1673. // Chris Burns 1994
  1674. ///////////////////////////////////////////////////////////////////////////////
  1675.  
  1676. #include <SoundInput.h>
  1677.  
  1678. static Boolean FailOSErr(OSErr ErrNum,Str255 ErrMsgStr);
  1679. static pascal void MyInterruptProc (SPBPtr PB,Ptr DataBuffer,short
  1680. PeakAmplitude,long SampleSize);
  1681.  
  1682. ///////////////////////////////////////////////////////////////////////////////
  1683.  
  1684. static Boolean FailOSErr(OSErr ErrNum,Str255 ErrMsgStr)
  1685. {
  1686.     if (ErrNum != noErr)
  1687.     {
  1688.     Str255          ErrStr;
  1689.     short           ErrMsgBytes;
  1690.     short           Extra;
  1691.  
  1692.         NumToString(ErrNum,ErrStr);
  1693.  
  1694.         ErrMsgBytes = ErrMsgStr[0];
  1695.         Extra = 0;
  1696.         if ((ErrMsgBytes + 1 + ErrStr[0] + 1) > 255)
  1697.         {
  1698.             ErrMsgBytes = 255 - (2 + ErrStr[0] + 1);
  1699.             ErrStr[1 + ErrStr[0] + 1] = '…';
  1700.             Extra = 1;
  1701.         }
  1702.  
  1703.         BlockMove(&ErrStr[1],&ErrStr[1 + ErrMsgBytes + Extra + 1],ErrStr[0]);
  1704.         BlockMove(&ErrMsgStr[1],&ErrStr[1],ErrMsgBytes);
  1705.  
  1706.         ErrStr[ErrMsgBytes + 1 + Extra] = '[';
  1707.         ErrStr[ErrMsgBytes + Extra + 1 + ErrStr[0] + 1] = ']';
  1708.         ErrStr[0] = ErrMsgBytes + Extra + 1 + ErrStr[0] + 1;
  1709.  
  1710.         DebugStr(ErrStr);
  1711.         return(true);
  1712.     }
  1713.     return(false);
  1714. }
  1715.  
  1716. ///////////////////////////////////////////////////////////////////////////////
  1717.  
  1718. #if !USESROUTINEDESCRIPTORS
  1719. #pragma parameter MyInterruptProc(__A0,__A1,__D0,__D1)
  1720. #endif
  1721.  
  1722. static pascal void MyInterruptProc (SPBPtr PB,Ptr DataBuffer,short
  1723. PeakAmplitude,long SampleSize)
  1724. {
  1725. #if !USESROUTINEDESCRIPTORS
  1726. long    SavedA5 = SetA5((*PB).userLong);
  1727. #endif
  1728.  
  1729.  
  1730.  
  1731.  
  1732.  
  1733.  
  1734. #if !USESROUTINEDESCRIPTORS
  1735.     SetA5(SavedA5);
  1736. #endif
  1737. }
  1738.  
  1739. ///////////////////////////////////////////////////////////////////////////////
  1740.  
  1741. void main (void)
  1742. {
  1743. OSErr               Err;
  1744. long                SIRefNum;
  1745. UniversalProcPtr    MyInterruptProcUPP = NewSIInterruptProc(MyInterruptProc);
  1746. SPB                 PB;
  1747. Boolean             Recording;
  1748.  
  1749.     Err = SPBOpenDevice("\p",siWritePermission,&SIRefNum);
  1750.     if (FailOSErr(Err,"\p FAILED"))
  1751.     {
  1752.     }
  1753.  
  1754. // Set up recording parameters (rate, sample size, stereo etc) here
  1755.  
  1756.     PB.inRefNum = SIRefNum;
  1757.     PB.bufferPtr = nil;
  1758.     PB.completionRoutine = nil;
  1759.     PB.interruptRoutine = MyInterruptProcUPP;
  1760.  
  1761. #if !USESROUTINEDESCRIPTORS
  1762.     PB.userLong = SetCurrentA5();
  1763. #endif
  1764.  
  1765.     Err = SPBRecord((SPBPtr)&PB,true);
  1766.     if (FailOSErr(Err,"\p FAILED"))
  1767.     {
  1768.     }
  1769.  
  1770.     Recording = true;
  1771.  
  1772.     while (Recording)
  1773.     {
  1774.         Recording = !Button();
  1775.     }
  1776.  
  1777.     Err = SPBStopRecording(SIRefNum);
  1778.     if (FailOSErr(Err,"\p FAILED"))
  1779.     {
  1780.     }
  1781.  
  1782.     Err = SPBCloseDevice(SIRefNum);
  1783.     if (FailOSErr(Err,"\p FAILED"))
  1784.     {
  1785.     }
  1786.  
  1787. #if USESROUTINEDESCRIPTORS
  1788.     DisposeRoutineDescriptor(MyInterruptProcUPP);
  1789. #endif
  1790. }
  1791.  
  1792. ///////////////////////////////////////////////////////////////////////////////
  1793.  
  1794. Chris B
  1795. - ---------------------------------------------------------------------
  1796. NewZealand:AucklandUniversity:ComputerScience:HyperMediaUnit:ChrisBurns
  1797. Internet: chris-b@cs.auckland.ac.nz
  1798. Phone:    +64 9 373-7599 x6194
  1799. Fax:      +64 9 373-7453                         Async, therefore I am.
  1800. - ---------------------------------------------------------------------
  1801.  
  1802. ---------------------------
  1803.  
  1804. End of C.S.M.P. Digest
  1805. **********************
  1806.  
  1807.  
  1808.  
  1809.